#!/bin/bash

#功能: 介绍find的用法和细节
#1. find [目录]
find /etc #相当于列出文件夹信息 相当于ls

#2. find [目录] -name filename
find /etc -name "passwd" #查找文件
find /etc -iname "passwd" #忽略大小写查找

#-o是||的意思 -a是&&的意思
find ../ \( -name "array.sh" -o -name "calc.sh" \) -print #查找两个文件
find ../ \( -name "*.sh" -a -name "calc.sh" \) -print 

#使用正则表达式
#实际表达式内容为:.*(.py|.sh)$, \是转义
find ~/ -regex ".*\(\.py\|\.sh\)$" #匹配py或者sh后缀文件
find ~/ -iregex ".*\(\.PY\|\.SH\)$"  #忽略大小写匹配

#否定匹配
find . ! -name "if.sh" #搜索if.sh以外的文件

#文件搜索深度限制
find . -maxdepth 1 -mindepth 0 -name "*.sh" #限制搜索深度在1级目录

# 文件类型过滤()
find ~ -type d -print #搜索文件夹
find ~ -type f -print #搜索普通文件

# 根据文件时间搜索(+/-表示时间大于或者小于)
#atime: 单位为天
#amin:  单位为分钟
find ~ -type f -atime -7 -print #搜索7天内访问过的普通文件
find ~ -type f -atime 7 -print  #搜索第七天访问的普通文件

#参考基准文件比较时间戳
find ../001-class -type f -newer ../001-class/debug.sh #搜索比debug.sh更新的文件

#基于文件大小搜索(单位可以是b/c/w/k/M/G)
find ~ -type f -size +2k #大于2k文件
find ~ -type f -size  2k #等于2k文件
find ~ -type f -size -2k #小于2k文件

#删除匹配文件
find . -name "*.swp" -delete

#基于文件权限查找(有三种情况)
#1> -perm  mode: 完全匹配 
find . -perm 0777 #文件必须具有777权限
find . -perm ugo=rwx 
#2> -perm /mode: 对应用户至少具有这些权限
find . -perm /0700 #文件属主必须具有rwx权限
find . -perm /u=rwx,go= 
#3> -perm -mode: 所有用户都需要具备的权限
find . -perm -0700 #所有用户必须具有rwx权限
find . -perm -u=rwx,go= 

#查找特定用户的文件
find . -type f -user root
find . -inum 21786260 # 查找inode 21786260的文件

#exec组合参数
find . -name -exec ls -la {} \; #{}是特殊字符串, 用于代替find获得的文件名
find . -name -exec ls -la {} + #+一次将所有文件提交给ls, ;每个文件单独提交， 因此前者效率更高

#排除某些文件查找
find .  -name ".git" -prune  -print  #从.目录开始查找.git目录, 找到后由于-prune参数不继续搜索子目录并打印
find . \( -name .git -prune \) -o \( -type f -print \) #排除.git并打印其他普通文件 (原理；查找.git目录，如果找到由于-prune不继续子目录查找, 如果没找到且是普通文件则打印)


